package ve.com.wayoyo.wuml_case.DibujoDiagramas;

import ve.com.wayoyo.wuml_case.Alert;
import ve.com.wayoyo.wuml_case.UserPref;
import ve.com.wayoyo.wuml_case.DibujoDiagramas.CompConector._arrowType;
import ve.com.wayoyo.wuml_case.Exceptions.TituloVacioExecption;
import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Point;

public class DiagramaClases extends Diagrama {

	private String PackageName = "default_package";

	public DiagramaClases() {
		super();
		Nombre = "";
		Tipo = "Clases";
	}

	public String getPackageName() {
		return PackageName;
	}

	public void setPackageName(String packageName) {
		PackageName = packageName;
	}

	@Override
	public void Dibujar(Canvas c, int offSetX, int offSetY, float GlobalScale) {

		// Scroll Bars
		if (((VistaDiagrama) VistaDiagrama.getVista()).getMoveFlag() == true) {
			dibujarScrollBars(c, offSetX, offSetY, GlobalScale);
		}

		// Zoom Helper
		if (((VistaDiagrama) VistaDiagrama.getVista()).isZooming() == true) {
			dibujarZoomGuide(c, GlobalScale);
		}

		// Muestra Pantalla
		if (_showHelp) {
			dibujarAyuda(c);
		}

		// Muestra los tips en el fondo de la pantalla
		if (_showTutorial) {
			dibujarTutorial(c);
		}

		for (Componente Value : _components) {
			// if(Value.CalcularVisibilidad(offSetX,offSetY,GlobalScale)){
			Value.Dibujar(c, false, GlobalScale, offSetX, offSetY);
			// }
		}

	}

	@Override
	public int checkOnTouch(Point touchPoint, String type) {
		if (_showHelp) {
			_showHelp = false;
		}
		CompConector aux = null;
		int respuesta = VistaDiagrama.IDLE;
		if (type.equals("Select")) {
			for (Componente Value : _components) {
				if (Value.calcularTouch(touchPoint) == true) {
					respuesta = VistaDiagrama.ITEM_SELECTED;
					resetFocus();
					if (_SelectedConector != null) {
						_SelectedConector.setState(CompConector.IDLE_STATE);
						getComponenteById(_SelectedConector.get_fatherId()).set_currentState(Componente.IDLE);
						getComponenteById(_SelectedConector.get_childId()).set_currentState(Componente.IDLE);
						_SelectedConector = null;
					}
					SelectedItem = Value;
					SelectedItem.set_currentState(Componente.SELECTED);
					_SelectedConector = null;
					break;
				} else {
					if (aux == null) {
						aux = Value.calcularTouchConectores(touchPoint);
					}
				}
			}
			if (aux != null) {
				_SelectedConector = aux;
				respuesta = VistaDiagrama.CONNECTOR_SELECTED;
				resetFocus();
				_SelectedConector.setState(CompConector.SELECTED_STATE);
				getComponenteById(_SelectedConector.get_fatherId())
						.set_currentState(Componente.LINKED);
				getComponenteById(_SelectedConector.get_childId())
						.set_currentState(Componente.LINKED);
			}
		}
		if (type.equals("Connect")) {
			for (Componente Value : _components) {
				if (Value.calcularTouch(touchPoint) == true && (Value.isConnectable())) {
					if((Value.ID != SelectedItem.ID) || Value.isAllowRecursivity()){
						respuesta = VistaDiagrama.ITEM_SELECTED;
						CompConector nuevo;
						if (SelectedItem instanceof CompInterface) {
							nuevo = new CompConector(SelectedItem.ID, Value.ID);
							if (!isImplements(Value, SelectedItem)) {
								nuevo.set_fatherArrowType(_arrowType.Herencia);
								nuevo.set_currentLineType(CompConector.DASHED_TYPE);
							} else {
								nuevo.set_fatherArrowType(_arrowType.Asociacion);
								nuevo.set_currentLineType(CompConector.NORMAL_TYPE);
							}
						} else if (Value instanceof CompInterface) {
							nuevo = new CompConector(SelectedItem.ID, Value.ID);
							if (!isImplements(Value, SelectedItem)) {
								nuevo.set_childArrowType(_arrowType.Herencia);
								nuevo.set_currentLineType(CompConector.DASHED_TYPE);
							} else {
								nuevo.set_childArrowType(_arrowType.Asociacion);
								nuevo.set_currentLineType(CompConector.NORMAL_TYPE);
							}
	
						} else {
							nuevo = new CompConector(SelectedItem.ID, Value.ID);
						}
						Value.actualizarAchorsPoints();
						Value.actualizarPuntoCentral();
						SelectedItem.actualizarAchorsPoints();
						SelectedItem.actualizarPuntoCentral();
						nuevo.CalcularConexiones(SelectedItem, Value);
						SelectedItem._conectorsBegining.add(nuevo);
						Value._conectorsEnd.add(nuevo);
						SelectedItem.set_currentState(Componente.SELECTED);
						if (_tutorialStage == 3) {
							_tutorialStage = 4;
						}
						break;
					}else{
						Alert.show("Este Componente no admite recursividad", (Activity) VistaDiagrama.getVista().getContext(), Alert.ERROR);
					}
				}
			}
		}
		return respuesta;
	}

	private boolean isImplements(Componente Value, Componente SelectedItem) {
		boolean ret_final = false;
		for (CompConector conector : SelectedItem.get_conectorsBegining()) {
			if ((SelectedItem.getID() == conector.get_fatherId())
					&& (Value.getID() == conector.get_childId()))
				ret_final = true;
		}
		for (CompConector conector : SelectedItem.get_conectorsEnd()) {
			if ((SelectedItem.getID() == conector.get_childId())
					&& (Value.getID() == conector.get_fatherId()))
				ret_final = true;
		}
		for (CompConector conector : Value.get_conectorsBegining()) {
			if ((Value.getID() == conector.get_fatherId())
					&& (SelectedItem.getID() == conector.get_childId()))
				ret_final = true;
		}
		for (CompConector conector : Value.get_conectorsEnd()) {
			if ((Value.getID() == conector.get_childId())
					&& (SelectedItem.getID() == conector.get_fatherId()))
				ret_final = true;
		}
		return ret_final;
	}

	@Override
	public void resetFocus() {
		for (Componente Value : _components) {
			Value.removeFocus();
		}
		SelectedItem = null;
	}

	@Override
	public boolean validarNombre(String nuevo) throws TituloVacioExecption {
		boolean respuesta = true;
		if (nuevo.length() < 1) {
			throw new TituloVacioExecption();
		}
		if (UserPref.getInstancia().isUsingConvections() == false) {
			for (Componente Value : _components) {
				if (Value.getTitulo().equals(nuevo))
					respuesta = false;
			}
		} else {
			String nuevoModf = nuevo.substring(0, 1).toUpperCase()
					+ nuevo.substring(1);
			for (Componente Value : _components) {
				if (Value.getTitulo().equals(nuevoModf))
					respuesta = false;
			}
		}
		return respuesta;
	}

	@Override
	public void moverItemSeleccionado(int distX, int distY) {
		if (_tutorialStage == 2) {
			_tutorialStage = 3;
		}
		if (SelectedItem != null) {
			SelectedItem.mover(distX, distY);
			SelectedItem.actualizarPuntoCentral();
			SelectedItem.actualizarAchorsPoints();
		}
	}

	public void agregarAtributo(CompAtributo comp) {
		if (SelectedItem instanceof CompClase) {
			((CompClase) SelectedItem).addAtributo(comp);
		} else if (SelectedItem instanceof CompAbstract) {
			((CompAbstract) SelectedItem).addAtributo(comp);
		}

	}
}
